/*
 * HashExtensible.h
 *
 *  Created on: 15/04/2013
 *      Author: pancho
 */

#ifndef HASHEXTENSIBLE_H_
#define HASHEXTENSIBLE_H_


#include <stdlib.h>
#include <list>
#include <string>
#include <math.h>
#include <iostream>

#include "../../Fisica/ArchivoBloques.h"
#include "../../Fisica/ArchivoRV.h"

using namespace std;


class Bloque;
class Registro;
class HashExtensible {

private:
	list<short unsigned int> * ListaDeNumerosDeBloque;
	ArchivoBloques * archivo;
	ArchivoRV* tabla;
	unsigned int tamanioBloque;
	unsigned int contadorDeIds;

public:
	HashExtensible(string path, string tipo, unsigned int tamanioBloque);

	void cargarTabla();
	void persistirTabla(); //tambien persiste el contador de ids en el archivo de la tabla

	unsigned int Agregar(string cancion, unsigned int id);
	unsigned int Agregar(unsigned int offset); //devuelve el id autogenerado

	list<unsigned int> *BuscarClave(unsigned int id);
	list<unsigned int> *BuscarClave(string titulo);

	int baja(unsigned int id);
	int baja(string titulo,unsigned int id);

	int fd(string unString);
	int fd(unsigned int unNumero);
	virtual ~HashExtensible();


	/////
	list<short unsigned int> * getListaDeNroDeBloques();
	bool redispersarClaves(Bloque* bloqueLLeno, Bloque* bloqueNuevo, Registro* unRegistroNuevo);
	void duplicarse();
	void dividirse();
	bool puedeDividirseEnDos();
	void ajustarALista(int& posAModificar);

	void modificarHashConNuevoBloque(unsigned short int numeroDelNuevoBloque,int posAModificar, unsigned short int nuevoTamanioDispersion);

	void setPos(int posEnTabla, unsigned short int nuevoValor);
	unsigned short int getPos(int posEnTabla);

	unsigned int getTamanioBloque();
	void setTamanioBloque(unsigned int nuevoTamanioBloque);

	unsigned int aumentarContadorIds();
	unsigned int getContadorIds();
};

#endif /* HASHEXTENSIBLE_H_ */
